home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / XPK / Source / xpkmaster / hook_fh.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-06  |  3.5 KB  |  148 lines

  1. #ifndef XPKMASTER_HOOK_FH_C
  2. #define XPKMASTER_HOOK_FH_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        hook_fh.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: hook_fh.c 1.3 (29.03.97)
  9.     Author:        SDI
  10.     Distribution:    PD
  11.     Description:    File IO hooks
  12.  
  13.  1.0   06.10.96 : first real version
  14.  1.1   01.01.97 : work around for sub library caused MungWall hits
  15.  1.2   10.01.97 : removed work around, because I found problem
  16.  1.3   29.03.97 : TOTSIZE now also in inhook
  17. */
  18.  
  19. #include <exec/types.h>
  20. #include <pragma/dos_lib.h>
  21. #include <pragma/exec_lib.h>
  22. #include "xpkmaster.h"
  23.  
  24. static LONG allociobuf(struct XpkMasterMsg *msg);
  25. static void freeiobuf(struct XpkMasterMsg *msg);
  26.  
  27. #ifdef __MAXON__
  28.   #define __asm
  29. #endif
  30.  
  31. /****************************** read-from-fh hook **************************/
  32. static LONG __asm fhinfunc(register __a1 struct XpkMasterMsg *msg)
  33. {
  34.   LONG wanted, epos;
  35.  
  36.   switch(msg->xmm_Type)
  37.   {
  38.   case XIO_SEEK:
  39.     if((msg->xmm_Size = Seek(msg->xmm_FH, msg->xmm_Size, OFFSET_CURRENT))<0)
  40.       return XPKERR_IOERRIN;
  41.     break;
  42.   case XIO_GETBUF:
  43.     if(allociobuf(msg))
  44.       return XPKERR_NOMEM;
  45.     msg->xmm_Ptr = msg->xmm_Buf;
  46.     break;
  47.   case XIO_READ:
  48.     if(!msg->xmm_Ptr)
  49.     {
  50.       if(allociobuf(msg))
  51.         return XPKERR_NOMEM;
  52.       msg->xmm_Ptr = msg->xmm_Buf;
  53.     }
  54.     wanted = msg->xmm_Size;
  55.     if((msg->xmm_Size = Read(msg->xmm_FH, msg->xmm_Ptr, wanted)) != wanted)
  56.       return msg->xmm_Size > 0 ? XPKERR_TRUNCATED : XPKERR_IOERRIN;
  57.     break;
  58.   case XIO_ABORT:
  59.   case XIO_FREE:
  60.     freeiobuf(msg);
  61.     if(msg->xmm_Flags & XMF_PRIVFH)
  62.       Close(msg->xmm_FH),
  63.     msg->xmm_FH = 0;
  64.     break;
  65.   case XIO_TOTSIZE:
  66.     if((wanted = Seek(msg->xmm_FH, 0, OFFSET_END)) < 0 ||
  67.     (epos = Seek(msg->xmm_FH, wanted, OFFSET_BEGINNING)) < 0)
  68.       return XPKERR_IOERRIN;
  69.     msg->xmm_Size = epos-wanted;
  70.     break;
  71.   }
  72.   return 0;
  73. }
  74.  
  75. struct Hook fhinhook = { {0}, (ULONG (*) ()) fhinfunc, 0, 0};
  76.  
  77. /****************************** write-to-fh hook **************************/
  78.  
  79. static LONG __asm fhoutfunc(register __a1 struct XpkMasterMsg *msg)
  80. {
  81.   LONG wanted;
  82.  
  83.   switch(msg->xmm_Type)
  84.   {
  85.   case XIO_GETBUF:
  86.     if(allociobuf(msg))
  87.       return XPKERR_NOMEM;
  88.     msg->xmm_Ptr = msg->xmm_Buf;
  89.     break;
  90.   case XIO_WRITE:
  91.     wanted = msg->xmm_Size;
  92.     if((msg->xmm_Size = Write(msg->xmm_FH, msg->xmm_Ptr, wanted)) != wanted)
  93.       return XPKERR_IOERROUT;
  94.     break;
  95.   case XIO_SEEK:
  96.     if((msg->xmm_Size = Seek(msg->xmm_FH, msg->xmm_Size, OFFSET_CURRENT))<0)
  97.       return XPKERR_IOERROUT;
  98.     break;
  99.   case XIO_ABORT:
  100.   case XIO_FREE:
  101.     freeiobuf(msg);
  102.     if(msg->xmm_Flags & XMF_PRIVFH)
  103.     {
  104.       Close(msg->xmm_FH);
  105.       msg->xmm_FH = 0;
  106.     }
  107.     break;
  108.   }
  109.   return 0;
  110. }
  111.  
  112. struct Hook fhouthook = { {0}, (ULONG (*) ()) fhoutfunc,0 ,0};
  113.  
  114. /**************** free fh I/O buf ***************/
  115. static void freeiobuf(struct XpkMasterMsg *msg)
  116. {
  117.   if(msg->xmm_BufLen) /* clear buffer, when exists */
  118.   {
  119.     FreeMem(msg->xmm_Buf, msg->xmm_BufLen);
  120.     msg->xmm_BufLen = 0;
  121.   }
  122. }
  123.  
  124. /**************** alloc fh I/O buf ***************/
  125. static LONG allociobuf(struct XpkMasterMsg *msg)
  126. {
  127.   ULONG buflen = msg->xmm_Size;
  128.  
  129.   if(msg->xmm_BufLen >= buflen) /* buffer is large enough */
  130.     return 0;
  131.  
  132.   freeiobuf(msg); /* clear old buffer */
  133.  
  134.   if(!(msg->xmm_Buf = (STRPTR) AllocMem(buflen, msg->xmm_MemType)))
  135.     return XPKERR_NOMEM; /* get new one */
  136.  
  137.   msg->xmm_BufLen = buflen; /* set correct data */
  138.  
  139. #ifdef DEBUG
  140.   DebugRunTime("allociobuf: allocated buffer at %lx of size %ld",
  141.   msg->xmm_Buf, msg->xmm_BufLen);
  142. #endif
  143.  
  144.   return 0; /* all ok */
  145. }
  146.  
  147. #endif /* XPKMASTER_HOOK_FH_C */
  148.